
package bd;
import classes.*;
import java.sql.*;
import java.util.*;
import javax.swing.JOptionPane;

public class UsuarioBD {

    public static Usuario validar(String email, String senha)
    {
        try{
            Connection conexao = Conexao.abrir();
            Statement comando = conexao.createStatement();
            String query = "select * from VIEW_SELECIONAUSUARIO where usu_email='"+email+"' and usu_senha='"+senha+"'";
            ResultSet resultado = comando.executeQuery(query);
            if(resultado.next()){
                Usuario novoUsuario = new Usuario();
                novoUsuario.setId(resultado.getInt("usu_id"));
                novoUsuario.setEmail(resultado.getString("usu_email"));
                novoUsuario.setSenha(resultado.getString("usu_senha"));
                novoUsuario.setNome(resultado.getString("usu_nome"));
                query = "select * from VIEW_VALIDAUSUARIO where usu_id = "+String.valueOf(novoUsuario.getId());
                resultado = comando.executeQuery(query);
                while(resultado.next())
                {
                    Acesso tempAcesso = new Acesso();
                    tempAcesso.setId(resultado.getInt("ace_id"));
                    tempAcesso.setDescr(resultado.getString("ace_descr"));
                    ArrayList<Acesso> tempListAcesso = novoUsuario.getListAcessos();
                    tempListAcesso.add(tempAcesso);
                    novoUsuario.setListAcessos(tempListAcesso);
                }
                return novoUsuario;
            }else{
                return null;
            }
        }catch(Exception excecao){
            JOptionPane.showMessageDialog(null, "UsuarioBD.validar: "+excecao.getMessage());
            return null;
        }
    }

    public static boolean salvar(Usuario novoUsuario){
        try{
            Connection conexao = Conexao.abrir();
            CallableStatement procedure = conexao.prepareCall("{call AT_USUARIO(NULL,?,?,?,NULL,?,?)}");
            procedure.setString(1,novoUsuario.getNome());
            procedure.setString(2,novoUsuario.getEmail());
            procedure.setString(3,novoUsuario.getSenha());
            procedure.setInt(4,novoUsuario.getSetor().getId());
            procedure.setString(5, "IN");
            procedure.execute();
            procedure.close();
            conexao.close();

            return true;

        }catch(Exception excecao){
            JOptionPane.showMessageDialog(null, "Não foi possível realizar a inserção do usuário: \n"+
                                                excecao.getMessage());
            return false;
        }
    }

    public static boolean alterar(Usuario novoUsuario, Usuario usuarioLogado){
        try{
            Connection conexao = Conexao.abrir();
            CallableStatement procedure = conexao.prepareCall("{call AT_USUARIO(?,?,?,?,?,?,?)}");

            procedure.setInt(1,novoUsuario.getId());
            procedure.setString(2,novoUsuario.getNome());
            procedure.setString(3,novoUsuario.getEmail());
            procedure.setString(4,novoUsuario.getSenha());
            procedure.setInt(5,usuarioLogado.getId());
            procedure.setInt(6,novoUsuario.getSetor().getId());
            procedure.setString(7, "AL");
            procedure.execute();
            procedure.close();
            conexao.close();

            return true;

        }catch(Exception excecao){
            JOptionPane.showMessageDialog(null, "Não foi possível realizar a inserção.");
            return false;
        }
    }

    public static boolean deletar(int codigo)
    {
        try{
            Connection conexao = Conexao.abrir();
            CallableStatement procedure = conexao.prepareCall("{call AT_USUARIO(?,?,?,?,?,?,?)}");
            procedure.setInt(1, codigo);
            procedure.setString(2,null);
            procedure.setString(3,null);
            procedure.setString(4,null);
            procedure.setInt(5,(Integer)null);
            procedure.setInt(6, (Integer)null);
            procedure.setString(7,"");
            procedure.execute();
            procedure.close();
            conexao.close();
            return true;
        }catch(Exception excecao)
        {
            return false;
        }
    }

    public static Usuario selecionar(int codigo)
    {
        Usuario retorno = new Usuario();
        try{
            Connection conexao = Conexao.abrir();
            Statement comandoSelect = conexao.createStatement();
            ResultSet resultado = comandoSelect.executeQuery("select * from VIEW_SELECIONAUSUARIO where usu_id="+codigo+"");
            if(resultado.next())
            {
                Usuario novoUsuario = new Usuario();
                novoUsuario.setId(resultado.getInt("usu_id"));
                novoUsuario.setNome(resultado.getString("usu_nome"));
                novoUsuario.setEmail(resultado.getString("usu_email"));
                novoUsuario.setSenha(resultado.getString("usu_senha"));
                novoUsuario.setSetor(SetorBD.selecionar(resultado.getInt("set_id")));

                String query = "select * from VIEW_VALIDAUSUARIO where usu.usu_id = "+String.valueOf(novoUsuario.getId());
                resultado = comandoSelect.executeQuery(query);
                while(resultado.next())
                {
                    Acesso tempAcesso = new Acesso();
                    tempAcesso.setId(resultado.getInt("ace_id"));
                    tempAcesso.setDescr(resultado.getString("ace_descr"));
                    ArrayList<Acesso> tempListAcesso = novoUsuario.getListAcessos();
                    tempListAcesso.add(tempAcesso);
                    novoUsuario.setListAcessos(tempListAcesso);
                }

                retorno=novoUsuario;
            }
            conexao.close();
            return retorno;
        }catch(Exception excecao)
        {
            return null;
        }
    }

    public static Usuario selecionar(String nome)
    {
        Usuario retorno = new Usuario();
        try{
            Connection conexao = Conexao.abrir();
            Statement comandoSelect = conexao.createStatement();
            ResultSet resultado = comandoSelect.executeQuery("select * from VIEW_SELECIONAUSUARIO where usu_nome='"+nome+"'");
            if(resultado.next())
            {
                Usuario novoUsuario = new Usuario();
                novoUsuario.setId(resultado.getInt("usu_id"));
                novoUsuario.setNome(resultado.getString("usu_nome"));
                novoUsuario.setEmail(resultado.getString("usu_email"));
                novoUsuario.setSenha(resultado.getString("usu_senha"));
                novoUsuario.setSetor(SetorBD.selecionar(resultado.getInt("set_id")));

                String query = "select * from VIEW_VALIDAUSUARIO where usu.usu_id = "+String.valueOf(novoUsuario.getId());
                resultado = comandoSelect.executeQuery(query);
                while(resultado.next())
                {
                    Acesso tempAcesso = new Acesso();
                    tempAcesso.setId(resultado.getInt("ace_id"));
                    tempAcesso.setDescr(resultado.getString("ace_descr"));
                    ArrayList<Acesso> tempListAcesso = novoUsuario.getListAcessos();
                    tempListAcesso.add(tempAcesso);
                    novoUsuario.setListAcessos(tempListAcesso);
                }

                retorno=novoUsuario;
            }
            conexao.close();
            return retorno;
        }catch(Exception excecao)
        {
            return null;
        }
    }

    public static ArrayList<Usuario> selecionar()
    {
        ArrayList<Usuario> vetUsuarios = new ArrayList<Usuario>();
        try{
            Connection conexao = Conexao.abrir();
            Statement comandoSelect = conexao.createStatement();
            ResultSet resultado = comandoSelect.executeQuery("select * from VIEW_SELECIONAUSUARIO");
            while(resultado.next())
            {
                Usuario novoUsuario = new Usuario();
                novoUsuario.setId(resultado.getInt("usu_id"));
                novoUsuario.setNome(resultado.getString("usu_nome"));
                novoUsuario.setEmail(resultado.getString("usu_email"));
                novoUsuario.setSenha(resultado.getString("usu_senha"));
                novoUsuario.setSetor(SetorBD.selecionar(resultado.getInt("set_id")));

                String query = "select * from VIEW_VALIDAUSUARIO where usu_id = "+String.valueOf(novoUsuario.getId());
                resultado = comandoSelect.executeQuery(query);
                while(resultado.next())
                {
                    Acesso tempAcesso = new Acesso();
                    tempAcesso.setId(resultado.getInt("ace_id"));
                    tempAcesso.setDescr(resultado.getString("ace_descr"));
                    ArrayList<Acesso> tempListAcesso = novoUsuario.getListAcessos();
                    tempListAcesso.add(tempAcesso);
                    novoUsuario.setListAcessos(tempListAcesso);
                }

                vetUsuarios.add(novoUsuario);
            }
            conexao.close();
            return vetUsuarios;
        }catch(Exception excecao)
        {
            return null;
        }
    }
}
